package 力扣;

/**
 * @author yyq
 * @create 2022-02-24 10:16
 */
public class day01 {
    public static void main(String[] args) {

        findClosedNumbers(2147483647);
    }

    public static int[] findClosedNumbers(int num) {
        int[] res={-1,-1};
        if(num<=0||num>2147483647){
            return res;
        }else {
            res[0] = preNum(num);
            res[1] = nextNum(num);
            System.out.println("较大的数为"+res[0]+",较小的数为"+res[1]);

        }
        return res;
    }

    //  取相邻的较小的数
    private static int nextNum(int n) {
        // 10011 1(P) 00111
        int c0=0;
        int c1=0;
        int c=n;
        //step 1 获取P前 1和0的个数
        while((c&1)==1){
            c1++;
            c=c>>1;
        }
        while((c&1)==0 && c0+c1!=32){
            c0++;
            c=c>>1;
        }
        // 000111111 没有比它小并且有相同个数的1
        int x = c0+c1;
        System.out.println("c0+c1="+x);
        if(c0+c1==32) return -1;


        //step 2 将P置0
        n = n & (~(1<<(c0+c1)));

        //step 3 将P后都置为 1
        n = n | ((1<<(c0+c1))-1);

        //step 4 将最后c0-1 个数置为0
        n = n & (~((1<<(c0-1))-1));

        return n;
    }

    //  取相邻的较大的数
    public static int preNum(int n){
        // 11100 0(P) 1111000
        // step 1 确定P前 0的个数c0和1的个数c1
        int c=n;
        int c1=0;
        int c0=0;
        while((c&1)==0){
            c0++;
            c=c>>1;
        }
        while((c&1)==1 ){
            c1++;
            c=c>>1;
        }

        System.out.println("c0:"+c0);
        System.out.println("c1:"+c1);
        // step 2 这种形式  11111111100000000 没有比它大的并且1的个数相同的数
        if((c0+c1)==31) return -1;

        // step 3 置P为1
        n = n | (1<<(c0+c1));
//        System.out.println(n);
        // step 4 置P后为0
        n = n & (~((1<<(c0+c1))-1));
//        System.out.println(n);
        // step 5 取P后c1-1位为1
        n = n | ((1<<(c1-1))-1);
        return n;
    }

}
